home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / devDiskLabel.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  7KB  |  204 lines

  1. /*
  2.  * devDiskLabel.h --
  3.  *
  4.  *      This defines the disk label that Sun writes on the 0'th sector of
  5.  *      the 0'th cylinder of its SMD disks.  The disk label contains some
  6.  *      geometry information and also the division of the disk into a
  7.  *      number of partitions.  Each partition is identified to the drive
  8.  *      by a different unit number.
  9.  *
  10.  * Copyright 1986 Regents of the University of California
  11.  * All rights reserved.
  12.  *
  13.  *
  14.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/dev/devDiskLabel.h,v 9.5 90/09/11 12:12:45 rab Exp $ SPRITE (Berkeley)
  15.  */
  16.  
  17. #ifndef _DEVDISKLABEL
  18. #define _DEVDISKLABEL
  19.  
  20. /*
  21.  * SUN_NUM_DISK_PARTS is the number of partitions that are recorded in
  22.  * the label information.  The size of the padding in the Sun_DiskLabel
  23.  * type is dependend on this number...
  24.  */
  25. #define SUN_NUM_DISK_PARTS  8
  26.  
  27. /*
  28.  * A disk is divided into partitions and this type specifies where a
  29.  * partition starts and how many blocks (sectors) it contains.
  30.  */
  31. typedef struct Sun_DiskMap {
  32.     int cylinder;
  33.     int numBlocks;
  34. } Sun_DiskMap;
  35.  
  36. /*
  37.  * Label information on the zero'th sector.  The partition map and the
  38.  * number of heads, sectors, and cylinders are used by the disk driver to
  39.  * map from a block number in a disk partion to a block number on the raw
  40.  * disk.  The gap and interleaving information are used by the block
  41.  * allocation routines.
  42.  */
  43. typedef struct Sun_DiskLabel {
  44.     char    asciiLabel[128];        /* For compatibility with other systems
  45.                      * that write an ascii label on a disk*/
  46.     char    pad[512-(128+8*8+11*2)];    /* The sector size is 512 bytes, and
  47.                      * padding puts our label info at the
  48.                      * end of the sector. */
  49.     unsigned short  gap1;        /* size of gap 1 */
  50.     unsigned short  gap2;        /* size of gap 2 */
  51.     unsigned short  interleave;        /* interleave factor */
  52.     unsigned short  numCylinders;    /* # of data cylinders */
  53.     unsigned short  numAltCylinders;    /* # of alternate cylinders */
  54.     unsigned short  numHeads;        /* # of heads in this partition */
  55.     unsigned short  numSectors;        /* # of 512 byte sectors per track */
  56.     unsigned short  bhead;        /* ?? Head number under which this
  57.                      * label is found, consistency chk */
  58.     unsigned short  partitionID;    /* physical partition # */
  59.     Sun_DiskMap map[SUN_NUM_DISK_PARTS]; /* Indicates the size and starting
  60.                      * cylinder of the disk partitions */
  61.     unsigned short  magic;        /* Identifies this label format */
  62.     unsigned short  checkSum;        /* XOR checksum of sector */
  63. } Sun_DiskLabel;
  64.  
  65. #define SUN_DISK_MAGIC       0xDABE
  66.  
  67. /*
  68.  * The sun label does not describe the location of the filesystem header
  69.  * information that comes after the zero'th label sector.  (The sprite label
  70.  * will, but is never used.)  Instead, the following constants are used.
  71.  * SUN_SUMMARY_SECTOR  one sector of summary info
  72.  * SUN_DOMAIN_SECTOR  the first sector of the static domain header
  73.  */
  74. #define SUN_SUMMARY_SECTOR    17
  75. #define SUN_DOMAIN_SECTOR    18
  76.  
  77. /* 
  78.  * SUN_LABEL_SECTOR -- sector holding the disk label
  79.  * SUN_BOOT_SECTOR -- first sector of the boot program
  80.  */
  81. #define SUN_LABEL_SECTOR 0
  82. #define SUN_BOOT_SECTOR 1
  83.  
  84. /*
  85.  * DEC_NUM_DISK_PARTS is the number of partitions that are recorded in
  86.  * the label information.  The size of the padding in the Dec_DiskLabel
  87.  * type is dependend on this number...
  88.  */
  89. #define DEC_NUM_DISK_PARTS  8
  90.  
  91. #define DEC_LABEL_VERSION 1
  92.  
  93. /*
  94.  * A disk is divided into partitions and this type specifies where a
  95.  * partition starts and how many bytes it contains.
  96.  */
  97. typedef struct Dec_DiskMap {
  98.     int numBytes;    /* Bytes in partition. */
  99.     int offsetBytes;    /* Start of partition in bytes. */
  100. } Dec_DiskMap;
  101.  
  102. typedef struct Dec_BootMap {
  103.     int numBlocks;    /* Number of blocks to read. */
  104.     int startBlock;    /* Starting block on disk. */
  105. } Dec_BootMap;
  106.  
  107. /*
  108.  * Label information on the 31st (DEC_LABEL_SECTOR)  sector.
  109.  */
  110. typedef struct Dec_DiskLabel {
  111.  
  112.     int        magic;            /* DEC_LABEL_MAGIC */
  113.     int        isPartitioned;        /* 1 if disk is partitioned. */
  114.     Dec_DiskMap map[DEC_NUM_DISK_PARTS]; /* Indicates disk partitions. */
  115.     /*
  116.      * The following stuff is a Sprite addition to the standard
  117.      *  Dec disk label.
  118.      */
  119.     int        numCylinders;
  120.     int        numAltCylinders;
  121.     int        numHeads;
  122.     int        numSectors;
  123.     int        bootSector;
  124.     int        numBootSectors;
  125.     int        summarySector;
  126.     int        domainSector;
  127.     int        numDomainSectors;
  128.     int        spriteMagic;        /* FSDM_DISK_MAGIC */
  129.     char    asciiLabel[128];        /* For compatibility. */
  130.     int        version;
  131.     char    pad[512-(13*4+DEC_NUM_DISK_PARTS*8+128)];/* 512 byte sector. */
  132. } Dec_DiskLabel;
  133.  
  134. /*
  135.  * Boot block information on the 0th sector.
  136.  * The boot program is stored in sequences of contiguous blocks.
  137.  * If mode is 0, there is just one sequence of blocks and one Dec_BootMap
  138.  * is used.  If mode is 1, there are multiple sequences of blocks
  139.  * and multiple Dec_BootMaps are used, the last with numBlocks = 0.
  140.  */
  141. typedef struct Dec_DiskBoot {
  142.     char    pad[8];
  143.     int        magic;            /* DEC_BOOT_MAGIC */
  144.     int        mode;            /* Mode for boot info. */
  145.     int        loadAddr;        /* Address to start loading. */
  146.     int        execAddr;        /* Address to start execing. */
  147.     Dec_BootMap    map[61];        /* Position of boot program. */
  148. } Dec_DiskBoot;
  149.  
  150. #define DEC_BOOT_MAGIC    0x02757a
  151. #define DEC_LABEL_MAGIC    0x032957
  152.  
  153. /*
  154.  * The following default values are used:
  155.  * DEC_BOOT_SECTOR    The sector holding the boot information.
  156.  * DEC_SUMMARY_SECTOR  one sector of summary info
  157.  * DEC_DOMAIN_SECTOR  the first sector of the static domain header
  158.  * DEC_LABEL_SECTOR    The sector holding the disk label.
  159.  */
  160. #define DEC_BOOT_SECTOR        0
  161. #define DEC_SUMMARY_SECTOR    17
  162. #define DEC_DOMAIN_SECTOR    18
  163. #define DEC_LABEL_SECTOR    31
  164.  
  165. /*
  166.  * Macro's to compute partition numbers from Fs_Device structures. Devices
  167.  * may be treated as non-partitioned.  In non-partitioned device the entire
  168.  * disk is treated as one partition.
  169.  * Disk device encode the Fs_Device unit number as follows:
  170.  *    bit 3      = if 1 treat disk as a raw disk with no partition. if 0
  171.  *            treat as partition disk.
  172.  *    bit 0 - 2 = if partitioned disk, bits 0 - 2 are the partition number.
  173.  *
  174.  * DISK_PARTITION() - Compute the partition number from the Fs_Device
  175.  *              structure.
  176.  * DISK_IS_PARTITIONED() - Return TRUE if a Fs_Device structure specifies a
  177.  *               non partitioned disk.
  178.  * WHOLE_DISK_PARTITION - The partition number specifing an entire disk.
  179.  */
  180.  
  181. #define    DISK_IS_PARTITIONED(fsDevice)    (!((fsDevice)->unit&0x8))
  182. #define    DISK_PARTITION(fsDevice)      ((fsDevice)->unit&0x7)
  183. #define    WHOLE_DISK_PARTITION (-1)
  184.  
  185. /*
  186.  * Disks contain a map that defines the way the disk is partitioned.
  187.  * Each partition corresponds to a different device unit.  Partitions
  188.  * are made up of complete cylinders because the disk layout and
  189.  * allocation strategies are cylinder oriented.
  190.  */
  191. typedef struct DevDiskMap {
  192.     int firstCylinder;        /* The first cylinder in the partition */
  193.     int numCylinders;        /* The number of cylinders in the partition */
  194. } DevDiskMap;
  195.  
  196. /*
  197.  * There are generally 8 disk partitions defined for a disk.
  198.  */
  199. #define DEV_NUM_DISK_PARTS    8
  200.  
  201.  
  202.  
  203. #endif /* _DEVDISKLABEL */
  204.